Apache HBase 是一个分布式的、面向列的 NoSQL 数据库，通常用于存储大规模数据。以下是使用 Java 连接和操作 HBase 的示例代码。

---

### **1. 环境准备**
确保你已经安装了以下工具：
- JDK 8+
- Apache HBase
- Maven

---

### **2. 创建 Maven 项目**
在 `pom.xml` 中添加 HBase 依赖：
```xml
<dependencies>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>2.5.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-common</artifactId>
        <version>2.5.5</version>
    </dependency>
</dependencies>
```

---

### **3. 编写 Java 代码**
以下是一个简单的 Java 程序，用于连接 HBase 并执行 CRUD 操作。

#### **3.1 连接 HBase**
```java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

public class HBaseExample {
    private static Connection connection;

    public static void main(String[] args) {
        try {
            // 配置 HBase
            Configuration config = HBaseConfiguration.create();
            config.set("hbase.zookeeper.quorum", "localhost"); // Zookeeper 地址
            config.set("hbase.zookeeper.property.clientPort", "2181"); // Zookeeper 端口

            // 创建连接
            connection = ConnectionFactory.createConnection(config);
            System.out.println("Connected to HBase!");

            // 创建表
            createTable("users", "info");

            // 插入数据
            insertData("users", "1", "info", "name", "Alice");
            insertData("users", "1", "info", "email", "alice@example.com");

            // 查询数据
            queryData("users", "1");

            // 更新数据
            updateData("users", "1", "info", "name", "Alice Smith");

            // 删除数据
            deleteData("users", "1");

            // 删除表
            deleteTable("users");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (connection != null) {
                    connection.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
```

#### **3.2 创建表**
```java
private static void createTable(String tableName, String... columnFamilies) throws Exception {
    try (Admin admin = connection.getAdmin()) {
        TableName name = TableName.valueOf(tableName);
        if (admin.tableExists(name)) {
            System.out.println("Table already exists!");
            return;
        }

        TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(name);
        for (String cf : columnFamilies) {
            ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.of(cf);
            tableDescriptor.setColumnFamily(family);
        }

        admin.createTable(tableDescriptor.build());
        System.out.println("Table created!");
    }
}
```

#### **3.3 插入数据**
```java
private static void insertData(String tableName, String rowKey, String columnFamily, String column, String value) throws Exception {
    try (Table table = connection.getTable(TableName.valueOf(tableName))) {
        Put put = new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));
        table.put(put);
        System.out.println("Data inserted!");
    }
}
```

#### **3.4 查询数据**
```java
private static void queryData(String tableName, String rowKey) throws Exception {
    try (Table table = connection.getTable(TableName.valueOf(tableName))) {
        Get get = new Get(Bytes.toBytes(rowKey));
        Result result = table.get(get);

        for (Cell cell : result.listCells()) {
            String family = Bytes.toString(CellUtil.cloneFamily(cell));
            String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell));
            String value = Bytes.toString(CellUtil.cloneValue(cell));
            System.out.println("Family: " + family + ", Qualifier: " + qualifier + ", Value: " + value);
        }
    }
}
```

#### **3.5 更新数据**
```java
private static void updateData(String tableName, String rowKey, String columnFamily, String column, String newValue) throws Exception {
    insertData(tableName, rowKey, columnFamily, column, newValue); // 插入数据即更新
    System.out.println("Data updated!");
}
```

#### **3.6 删除数据**
```java
private static void deleteData(String tableName, String rowKey) throws Exception {
    try (Table table = connection.getTable(TableName.valueOf(tableName))) {
        Delete delete = new Delete(Bytes.toBytes(rowKey));
        table.delete(delete);
        System.out.println("Data deleted!");
    }
}
```

#### **3.7 删除表**
```java
private static void deleteTable(String tableName) throws Exception {
    try (Admin admin = connection.getAdmin()) {
        TableName name = TableName.valueOf(tableName);
        if (admin.tableExists(name)) {
            admin.disableTable(name);
            admin.deleteTable(name);
            System.out.println("Table deleted!");
        } else {
            System.out.println("Table does not exist!");
        }
    }
}
```

---

### **4. 运行代码**
1. 启动 HBase：
   ```bash
   start-hbase.sh
   ```
2. 编译并运行程序：
   ```bash
   mvn clean package
   java -cp target/hbase-example-1.0.jar HBaseExample
   ```

---

### **5. 代码说明**
- **HBaseConfiguration**：用于配置 HBase 连接。
- **Connection**：管理 HBase 连接。
- **Table**：用于操作表数据。
- **Put/Get/Delete**：分别用于插入、查询和删除数据。

---

### **6. 扩展**
- **批量操作**：使用 `Table.put(List<Put>)` 执行批量插入。
- **扫描表**：使用 `Scan` 扫描表中的数据。
- **过滤器**：使用 `Filter` 过滤查询结果。

---

### **7. 注意事项**
- 确保 HBase 和 Zookeeper 服务已启动。
- 在生产环境中，使用更复杂的配置（如多节点集群）。
- 处理异常情况，如连接失败或查询错误。

---

### **8. 完整示例**
假设你的项目结构如下：
```
src/main/java/HBaseExample.java
pom.xml
```

运行后，输出如下：
```
Connected to HBase!
Table created!
Data inserted!
Data inserted!
Family: info, Qualifier: name, Value: Alice
Family: info, Qualifier: email, Value: alice@example.com
Data updated!
Data deleted!
Table deleted!
```

---

希望这个示例对你有帮助！如果有其他问题，请随时提问。